package com.yan.design.two.establish.s3;

import java.util.Date;

/**
 * 三.原型模式
 *      浅拷贝
 * @author shengren.yan
 * @create 2022-07-17
 */
public class runMain {

    public static void main(String[] args) throws Exception {
        // 原型模式

        // --- 之前拷贝对象方式：
//        Prototype1 p1 = new Prototype1();
//        Prototype1 p2 = new Prototype1();
//        Prototype1 p3 = new Prototype1();


        // A 浅拷贝
//        Prototype1 p1 = new Prototype1("yan",new Date());
//        System.out.println("p1---" + p1);
//        System.out.println("p1---hash---" + p1.hashCode());
//        try {
//
//            Prototype1 p2 = (Prototype1) p1.clone();
//            p2.setName("yy");  // 更改p2对象，p1对象也更改，说明是浅拷贝 - 地址引用
//            System.out.println("p1---" + p1);
//            System.out.println("p1---hash---" + p1.hashCode());
//
//            System.out.println("p2---" + p2);
//            System.out.println("p2---hash---" + p2.hashCode());
//        } catch (CloneNotSupportedException e) {
//            e.printStackTrace();
//        }


//        // B 深拷贝 -- 方式1
//        Prototype1 p1 = new Prototype1("yan",new Date(),new Dep());
//        Prototype1 p2 = (Prototype1) p1.clone();
//
//        System.out.println("p1---" + p1);
//        System.out.println("p1---hash---" + p1.hashCode());
//
//        p2.setName("yy");  // 更改p2对象，p1对象也更改，说明是浅拷贝 - 地址引用
//        System.out.println("p2---" + p2);
//        System.out.println("p2---hash---" + p2.hashCode());
//
//        System.out.println("p1---" + p1);
//        System.out.println("p1---hash---" + p1.hashCode());


        // B 深拷贝 -- 方式2  通过序列化
        Prototype1 p1 = new Prototype1();
        p1.setName("qqq");
//        p1.setDep();
        Prototype1 p2 = (Prototype1) p1.doClone();

        System.out.println("p1---" + p1);
        System.out.println("p1---hash---" + p1.hashCode());

        p2.setName("yy");  // 更改p2对象，p1对象也更改，说明是浅拷贝 - 地址引用
        System.out.println("p2---" + p2);
        System.out.println("p2---hash---" + p2.hashCode());

        System.out.println("p1---" + p1);
        System.out.println("p1---hash---" + p1.hashCode());

    }
}

// 类复制
